// 2025.03.02 15:26 星期日 阴 无事
// 这个是 管理 (监听事件管理 核检) 的 小 子集

import {
  ObjectOnlyPushSet,
  removeObjectOnlyPushSet,
} from '../../../../Func/uniFunc/Func/ObjectOnlyPushSet_operate';
import { addEvent, removeEvent } from '../../Func/add_remove_eventListen';
import {
  winStatic_listenEvent,
  winstatic_listenEvent_data,
} from '../DataDefine/sourceData';
import { freeze_listenEvent_info_mana } from './cla_freeze_listenEvent_info_mana';
import { listenEvent_info_mana } from './cla_listenEvent_info_mana';

const unit_listenEvent_manaTag = 'unit_listenEvent_mana';

const unit_listenEvent_mana_prop_freeze_data = 'freeze_data';

class unit_listenEvent_mana {
  get [Symbol.toStringTag]() {
    return unit_listenEvent_manaTag;
  }

  constructor(spacename) {
    this.spacename = spacename;
  }

  /**
   * 命名 空间
   */
  spacename;

  freeze_data = [];

  /**
   * 正在 绑定 的 事件 信息集
   */
  on = new listenEvent_info_mana();

  /**
   * 已 解除 的 事件 信息集
   */
  off = new listenEvent_info_mana();

  /**
   * 添加事件 信息 添加 到 on 集合里
   * @param {HTMLElement} el
   * @param {import('../../Func/add_remove_eventListen').eventA} event
   * @param {Function} fn
   * @param {?Boolean} options
   */
  addEventListen(targetEl, event, fn, options) {
    addEvent(targetEl, event, fn, options);
    this.on.addInfo(targetEl, event, fn);
  }

  /**
   * 移出 on 事件 信息 添加 到 off 集合里
   * @param {HTMLElement} el
   * @param {import('../../Func/add_remove_eventListen').eventA} event
   * @param {Function} fn
   * @param {?Boolean} options
   */
  removeEventListen(targetEl, event, fn, options) {
    removeEvent(targetEl, event, fn, options);
    let deleteArr = this.on.removeInfo(targetEl, event, fn);
    for (const uniInfo of deleteArr) {
      let { targetEl, event, fn } = uniInfo;
      this.off.addInfo(targetEl, event, fn);
    }
  }

  /**
   * 在 此 空间下 可以 临时 冻结某些 on 上的 信息记录
   * @param {string} freezeName 冻结 名称
   * @returns {freeze_listenEvent_info_mana}
   */
  freezeSpace(freezeName) {
    ObjectOnlyPushSet(
      this,
      freezeName,
      new freeze_listenEvent_info_mana(this),
      unit_listenEvent_mana_prop_freeze_data
    );

    return this[freezeName];
  }

  /**
   * 在 此 空间下 可以 解冻 该空间 内 on 上的 信息记录
   * @param {string} freezeName 冻结 名称
   */
  disfreezeSpace(freezeName) {
    /**
     * @type {freeze_listenEvent_info_mana}
     */
    let frozen_mana = this[freezeName];
    frozen_mana?.unfreezeAll();

    removeObjectOnlyPushSet(
      this,
      freezeName,
      true,
      unit_listenEvent_mana_prop_freeze_data
    );
  }

  /**
   * 删除 window 上的 信息
   */
  destroy() {
    removeObjectOnlyPushSet(
      window[winStatic_listenEvent],
      this.spacename,
      true,
      winstatic_listenEvent_data
    );
  }
}

export { unit_listenEvent_mana };
